/**
 * grayrabbit Inc.
 * Copyright (c) 2011-2012 All Rights Reserved.
 */
package com.grayrabbit.slacker.utils;

import org.apache.commons.lang.StringUtils;

import com.grayrabbit.slacker.config.GenerateConfig;
import com.grayrabbit.slacker.constant.ConfigConstant;
import com.grayrabbit.slacker.constant.PropertyConsant;
import com.grayrabbit.slacker.file.TemplateFileProvider;

/**
 * 名称处理辅助类
 * 
 * @author liyd
 * @version $Id: TemplateProcessUtils.java, v 0.1 2012-5-11 下午2:15:00 liyd Exp $
 */
public class TemplateProcessUtils {

    /**
     * 得到需要生成的文件路径
     * 
     * @param generateConfig
     * @param tableConfig
     * @return
     */
    public static String getTargetFilePath(GenerateConfig generateConfig) {

        //模块项目路径
        String moduledir = getModuleHomeDir(generateConfig);

        //源代码路径
        String srcDir = getSrcDir(generateConfig);

        //包路径
        String targetPackage = getPackageDir(generateConfig);

        //类名
        String className = getClassName(generateConfig);

        //后缀
        String suffix = getSuffix(generateConfig);

        String targetFilePath = ConfigConstant.GENERATE_PROJECT_HOME
                                + PropertyConsant.DIR_SEPARATOR + moduledir
                                + PropertyConsant.DIR_SEPARATOR + srcDir
                                + PropertyConsant.DIR_SEPARATOR + targetPackage
                                + PropertyConsant.DIR_SEPARATOR + className + suffix;

        return targetFilePath;
    }

    /**
     * 得到需要生成的文件的文件夹
     * 
     * @param generateConfig
     * @return
     */
    public static String getTargetDirPath(GenerateConfig generateConfig) {

        //模块项目路径
        String moduledir = getModuleHomeDir(generateConfig);

        //源代码路径
        String srcDir = getSrcDir(generateConfig);

        String targetDirPath = ConfigConstant.GENERATE_PROJECT_HOME + PropertyConsant.DIR_SEPARATOR
                               + moduledir + PropertyConsant.DIR_SEPARATOR + srcDir;

        //包路径
        String targetPackage = getPackageDir(generateConfig);

        if (StringUtils.isNotBlank(targetPackage)) {
            targetDirPath = targetDirPath + PropertyConsant.DIR_SEPARATOR + targetPackage;
        }

        return targetDirPath;
    }

    /**
     * 得到表对应的生成实体类名 包含包名
     * 
     * @param generateConfig
     * @return
     */
    public static String getQualifiedClassName(GenerateConfig generateConfig) {

        //包路径
        String packageName = getPackageName(generateConfig);

        //类名
        String className = getClassName(generateConfig);

        return packageName + PropertyConsant.PACKAGE_SEPARATOR + className;
    }

    /***
     * 生成模板文件
     */
    public static void writeFile(String targetFilePath, String vm) {

        TemplateFileProvider.writeFile(targetFilePath, vm);

    }

    /**
     * 获取模块项目路径
     * 
     * @param generateConfig
     * @return
     */
    public static String getModuleHomeDir(GenerateConfig generateConfig) {

        String moduledir = generateConfig.getProperties().get(PropertyConsant.MODULE_DIR)
            .getValue();

        if (moduledir == null) {
            return "";
        }

        return moduledir;
    }

    /**
     * 获取源代码文件夹路径
     * 
     * @param generateConfig
     * @return
     */
    public static String getSrcDir(GenerateConfig generateConfig) {

        String srcdir = generateConfig.getProperties().get(PropertyConsant.SRC_DIR).getValue();

        if (srcdir == null) {
            return "";
        }

        return srcdir;
    }

    /**
     * 获取文件后缀
     * 
     * @param generateConfig
     * @return
     */
    public static String getSuffix(GenerateConfig generateConfig) {

        String suffix = generateConfig.getProperties().get(PropertyConsant.SUFFIX).getValue();

        if (suffix == null) {
            return "";
        }

        return suffix;
    }

    /**
     * 获取包名
     * 
     * @param generateConfig
     */
    public static String getPackageName(GenerateConfig generateConfig) {

        String packageName = generateConfig.getProperties().get(PropertyConsant.PACKAGE).getValue();

        if (packageName == null) {

            return "";
        }

        //包名
        return packageName;
    }

    /**
     * 获取包路径
     * 
     * @param generateConfig
     */
    public static String getPackageDir(GenerateConfig generateConfig) {

        //包名
        String packageName = getPackageName(generateConfig);

        //包路径
        return StringUtils.replace(packageName, PropertyConsant.PACKAGE_SEPARATOR,
            PropertyConsant.DIR_SEPARATOR);
    }

    /**
     * 获取类名
     * 
     * @param tableConfig
     * @return
     */
    public static String getClassName(GenerateConfig generateConfig) {
        //类名
        return getBeginFix(generateConfig) + getNameWordFirstUpper(generateConfig.getTableName())
               + getEndFix(generateConfig);
    }

    /**
     * 获取名称，首字母大写 根据"_"拆分
     * 
     * @param name 
     */
    public static String getFirstUpperName(String name) {

        return getNameWordFirstUpper(name);
    }

    /**
     * 转换第一个字母为小写
     * 
     * @param name
     * @return
     */
    public static String convertFirstLower(String name) {

        return name.substring(0, 1).toLowerCase() + name.substring(1);

    }

    /**
     * 转换第一个字母为大写
     * 
     * @param name
     * @return
     */
    public static String convertFirstUpper(String name) {

        return name.substring(0, 1).toUpperCase() + name.substring(1);

    }

    /**
     * 根据列名生成属性名，采用骆驼命名法 首字母小写
     * 名称中包含"_"的，进行分隔，并使分隔后的首字母大写
     * 
     * @param columnName 列名
     * @return
     */
    public static String getPropertyName(String name) {

        String tmp = getNameWordFirstUpper(name);

        return tmp.substring(0, 1).toLowerCase() + tmp.substring(1);

    }

    /**
     * 根据"_"拆分成单词，每个首字母大写
     * 
     * @param name
     * @return
     */
    public static String getNameWordFirstUpper(String name) {

        String tmp = name.toLowerCase();

        //根据下划线将列名拆分
        String[] names = tmp.split("_");

        //返回的属性名
        StringBuilder propertyName = new StringBuilder();

        //有多个，将后面的首字母大写
        for (int i = 0; i < names.length; i++) {

            propertyName.append(names[i].substring(0, 1).toUpperCase() + names[i].substring(1));

        }

        return propertyName.toString();

    }

    /**
     * 获取生成文件固定开头名
     * 
     * @param generateConfig
     * @return
     */
    public static String getBeginFix(GenerateConfig generateConfig) {

        String beginFix = generateConfig.getProperties().get(PropertyConsant.BEGIN_FIX).getValue();

        if (beginFix == null) {
            return "";
        }

        return beginFix;

    }

    /**
     * 获取模板文件
     * 
     * @param generateConfig
     * @return
     */
    public static String getTemplate(GenerateConfig generateConfig) {

        return TemplateFileProvider.getTemplate(generateConfig.getProperties()
            .get(PropertyConsant.TEMPLATE).getValue());
    }

    /**
     * 获取模板文件
     * 
     * @param templateName
     * @return
     */
    public static String getTemplate(String templateName) {

        return TemplateFileProvider.getTemplate(templateName);
    }

    /**
     * 获取生成文件固定结尾名
     * 
     * @param generateConfig
     * @return
     */
    public static String getEndFix(GenerateConfig generateConfig) {

        String endFix = generateConfig.getProperties().get(PropertyConsant.END_FIX).getValue();

        if (endFix == null) {
            return "";
        }

        return endFix;

    }

}
